/* 
 * File:   Element.h
 * Author: H4314
 *
 * Created on 3 avril 2012, 09:46
 */

#ifndef ELEMENT_H
#define	ELEMENT_H

#include <string>
#include <list>
#include <vector>
#include <iostream>
#include <boost/regex.hpp>

#include "Node.h"
#include "Content.h"
#include "Attribute.h"

using namespace std;
using namespace boost;

class Element : public Node {
public:
    // Constructeurs & Destructeurs
    Element(const string & name, const string & nameSpace = "", const list<Node *> & children = list<Node *>(), const list<Attribute *> & attributes = list<Attribute *>());
    Element(const Element& orig);
    virtual ~Element();
    
    // Getters
    const string & getName() const;
    const string & getNameSpace() const;
    const list<Node *> & getChildren() const;
    const list<Attribute *> & getAttributes() const;
    
    // Setters
    void setName(const string & newName);
    void setNameSpace(const string & newNameSpace);
    void setChildren(const list<Node *> & newChildren);
    void setAttributes(const list<Attribute *> & newAttributes);
    
    // Adders
    void addChild(Node * child);
    void addAttribute(Attribute * attribute);
    
    // Affichage
    
    // Affichage type XML sur ostream. Level doit être mis à 0, colored sert
    // à afficher des couleurs
    virtual void Tree(ostream & stream, int level) const;
    
    // Affichage sous forme d'arbre destiné à un humain
    virtual void Draw(ostream & stream, int level, bool colored) const;
    
     // Génère la chaîne permettant d'être validée par expression régulière
    virtual void Print(ostream & stream) const;
    
    // Vrai si l'élément possède des enfants
    bool hasChildren() const;
    
    // Génère la chaîne permettant de valider par expression régulière
    virtual string createValidationString() const;
    
    // Valide l'élément avec une suite d'expression régulières
    virtual bool validationWithDTD(map<string,regex> *regexs) const;
    
private:
    string name;
    string nameSpace;
    list<Node *> children;
    list<Attribute *> attributes;
    bool containsElement;
    void childrenHasChanged();
    string toString(int tagMode, const string & indent = "", bool colored = false) const;
};
#endif	/* ELEMENT_H */
